#pragma once
#include <cstdio>
#include <cstdarg>
#include <cassert>
#include <cstdlib>
#include <ctime>

#define DEBUG    0
#define NOTICE   1
#define WARINING 2
#define FATAL    3

const char* log_level[]={"DEBUG","NOTICE","WARINING","FATAL"};

//logMessage(DEBUG,"%d",10)
void logMessage(int level, const char* format, ...)
{
    assert(level>=DEBUG);
    assert(level<=FATAL);

    char*name = getenv("USER");

    char logInfo[1024];
    va_list ap;
    va_start(ap,format);//cstdarg

    vsnprintf(logInfo,sizeof(logInfo)-1,format,ap);//用于将格式化的数据写入字符串中

    va_end(ap);//ap==null

    FILE* out = (level==FATAL)?stderr:stdout;

    fprintf(out,"%s | %u | %s | %s\n",\
    log_level[level],\
    (unsigned int)time(nullptr),\
    name == nullptr?"unknow":name,\
    logInfo);
}